import type { MenuData } from "@/data/menuData";
import type { RouteRecordRaw } from "vue-router";
import router from "@/router";

/**
 * 该函数什么时候调用? 登陆成功后,准备跳转到Home页面时加载
 */

/**
 * 自动注册路由,该函数会menu数据添加到路由中。几个注意点:
 * 1. menuItem中key会被当做路由path和name(/会被替换为-),如果menuItem中name属性存在,则路由name为该name
 * 2. menuItem中meta元属性如果存在,则路由的meta项为该meta项,默认为空对象{}
 * 3. menuItem中meta元属性对象中一些属性的作用：title会被当做html标题；permissionCode权限码控制用户访问的页面。
 * 4. 路由层级: 通过key来判断路由层级，每级通过/分割。组件位置也需要规范,例如key为/logs/user。则对应组件位置应为 @/pages/logs/user.vue或自定义组件位置
 *
 */
const ComponentRootPath = new URL("../pages", import.meta.url).href;
// 将所有的组件全部注册到 home(/)下 所以注册时 path 不能为/开头
export default function (menuData: MenuData) {
    const homeChildren: RouteRecordRaw["children"] = [];
    const func = function (menuData: MenuData, children: Array<RouteRecordRaw>) {
        for (const menuItem of menuData) {
            if (!menuItem.key.includes("/")) {
                console.debug("menuItem.key prefix must be / !!!");
                continue;
            }
            // 当前path属性 /logs -> logs
            const path = menuItem.key.split("/").pop() as string;
            // 当前路由名
            const routeName =
                menuItem.meta.customRouteName || menuItem.key.slice(1).replace("/", "-");
            if (menuItem.children && menuItem.children.length) {
                const newChildren: RouteRecordRaw["children"] = [];
                const recordRaw: RouteRecordRaw = {
                    name: routeName,
                    meta: menuItem.meta,
                    path,
                    redirect: menuItem.redirect,
                    children: newChildren,
                };
                children.push(recordRaw);
                func(menuItem.children, newChildren);
            } else {
                const componentPath = `${ComponentRootPath}${menuItem.meta.customComponentPosition || menuItem.key}.vue`;
                const recordRaw: RouteRecordRaw = {
                    component: () => import(/* @vite-ignore */ componentPath),
                    name: routeName,
                    meta: menuItem.meta,
                    path: path,
                };
                children.push(recordRaw);
            }
        }
    };
    // 将所有的路由添加到home下
    func(menuData, homeChildren);
    registerRoute(homeChildren);
}

// 注册路由
function registerRoute(children: Array<RouteRecordRaw>) {
    for (const item of children) {
        router.addRoute("home", item);
    }
}
